/******************************************************************************
*@file  : app.h
*@brief : header file
******************************************************************************/

#ifndef __APP_H__
#define __APP_H__

#include "awp1921.h"



#define EC_LED_NUM_TWO   //表示只有指纹双色指示灯, 通过GPIO_SCL和GPIO_AL0控制



//FPR输出信号，用于控制是否是按键事件还是指纹事件
#define SWITCH_PA3_PIN            GPIO_PIN_3

//Elan输出信号，用于控制改变LED灯颜色，指纹结果比对指示灯, 但是对于ACM32F421为输入信号
#define GPIO_SCL_PA2_PIN          GPIO_PIN_2

//elan输出信号，用于电源键屏蔽，同时控制一路LED灯，指纹工作状态指示灯, 但是对于ACM32F421为输入信号
#define GPIO_AL0_PA4_PIN          GPIO_PIN_4

//输入信号，指示CPU或者EC state电源状态
#define DELINK_PA9_PIN            GPIO_PIN_9


//awp1921 中断脚
#define GPIO_PB1_PIN              GPIO_PIN_1


typedef enum
{
    EC_STATUS_S0_MS = 1,   //表示DELINK线为高电平，PC正常工作
    EC_STATUS_S4_S5 = 2,   //表示DELINK线为低电平, PC掉电睡眠
    EC_STATUS_PENDING = 3,   //初始化设置，因为还没有实际读取DELINK线的电平
} EC_Power_Status;


/*
    初始化：如果GPIO_AL0为高电平， 设置为指纹录入开始状态或者是指纹比对开始状态
           如果GPIO_AL0为低电平，设置为按键事件

                         |-----由低变高 进入指纹录入开始状态或者是指纹比对开始状态
                         |
    GPIO_AL0 高电平 -----|-----由高变低|------ 指纹录入结束或者指纹比对成功  短振slice0波形
                                       |------ 指纹比对失败（判断条件是50ms后继续拉高GPIO AL0）  长振slice0波形

    GPIO_AL0 低电平 -----按键事件  需要注意指纹比对失败拉低的50ms事件继续作为指纹失败事件，不响应按键事件
                         按键事件中振动slice0波形
*/

typedef enum
{
    /* GPIO_AL0 上升沿 由低电平变为高电平 */
    ELAN_FP_STATUS_ENROLL_START = 1,   //ENROLL 录入登记指纹开始
    //指纹开始比对和指纹开始 录入都是GPIO_AL0 低电平变高电平对于MCU状态是一样的
    ELAN_FP_STATUS_COMPARISON_START = ELAN_FP_STATUS_ENROLL_START, //FR指纹比对开始


    ELAN_FP_STATUS_PENDING_START = 7,  //还未能确定是否是指纹识别成功或者失败
    /* GPIO_AL0 下降沿沿 由高电平变为低电平 */
    ELAN_FP_STATUS_PENDING = 2,  //还未能确定是否是指纹识别成功或者失败

    ELAN_FP_STATUS_ENROLL_END = 3,   //ENROLL 录入登记指纹完成
    //指纹比对成功和指纹录入状态完成都是GPIO_AL0 高电平变低电平,对于MCU状态是一样的
    ELAN_FP_STATUS_COMPARISON_SUCCESS  = ELAN_FP_STATUS_ENROLL_END, //FR指纹比对成功
    //指纹比对失败
    ELAN_FP_STATUS_COMPARISON_FAIL = 4, // 拉低50ms是否重新拉高表示失败

    EC_CONTROL_STATUS_BOTTON = 5, //低电平表示为BOTTON 电源键有效

    GPIO_AL0_STATUS_PENDING = 6, //初始化设置，因为还没有实际读取PENDING线的电平

} GPIO_AL0_Status; // GPIO AL0 管脚复用表示多种状态


typedef enum
{
    GPIO_PB1_PRESS_RELEASS = 1, //存在按压抬起事件
    GPIO_PB1_IDLE = 2, //存在按压抬起事件
} GPIO_PB1_Status;



void GPIO_Interface_Init(void);


void APP_Loop(void);


#endif
